package model.recipe;

import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.engine.builder.xml.SqlMapClasspathEntityResolver;
import com.ibatis.sqlmap.engine.mapping.sql.Sql;

import model.recipe.exception.DuplicateWriteException;
import model.recipe.exception.NotFoundRecipeException;
import model.recipe.paging.BBom_ListVO;
import model.recipe.paging.CommonConstants;
import model.recipe.paging.ListVO;
import model.recipe.paging.PagingBean;
import model.recipe.paging.Reply_CommonConstants;
import model.recipe.paging.Reply_ListVO;
import model.recipe.paging.Reply_PagingBean;
import model.recipe.paging.SearchConstants;

public class RecipeService {
	private RecipeDao dao;

	public RecipeService() {
		super();
		// TODO Auto-generated constructor stub
	}

	public RecipeService(RecipeDao dao) {
		super();
		this.dao = dao;
	}

	public void write(RecipeVO vo, List list) throws SQLException {

		String date = dao.getDate();

		vo.setR_date(date);
		System.out.println(vo + "write전 service");
		dao.write(vo);

		for (int i = 0; i < list.size(); i++) {
			RecipeDescVO rdvo = (RecipeDescVO) list.get(i);
			rdvo.setR_no(vo.getR_no());
			dao.writeDesc(rdvo);
		}

	}

	// 레시피 검색_전체
	public HashMap searchByRecipe(HashMap smap) throws SQLException {
		int rownum = SearchConstants.CONTENT_NUMBER_PER_LINE;
		System.out.println(smap);
		String s_word = smap.get("s_word").toString(); // 검색어
		String s_type = smap.get("s_type").toString(); // 검색조건
		String s_order = smap.get("s_order").toString(); // 정렬기준
		HashMap smap1 = new HashMap(); // 관리자 레시피용
		if (!s_type.equals("")) {
			smap1.put("word", s_word);
			smap1.put("s_type", s_type);
		}
		smap1.put("s_order", s_order);
		smap1.put("r_user", "a");
		smap1.put("rownum", rownum);

		System.out.println("smap1"+smap1);
		HashMap smap2 = new HashMap(); // 사용자 레시피용
		if (!s_type.equals("")) {
			smap2.put("word", s_word);
			smap2.put("s_type", s_type);
		}
		System.out.println(rownum + "rownum");
		smap2.put("s_order", s_order);
		smap2.put("r_user", "b");
		smap2.put("rownum", rownum);
		System.out.println("smap2"+smap2);
		List list_user = dao.searchByRecipe(smap2);// 사용자
		List list_admin = dao.searchByRecipe(smap1);// 관리자

		// 결과값 묶기
		HashMap map = new HashMap();
		map.put("list_user", list_user);
		map.put("list_admin", list_admin);
		map.put("s_order", s_order);
		return map;
	}// searchByRecipe
	
	public ListVO userListByRecipe(String page) throws SQLException {
		String user = "b";//뽐내기는 회원만 작성한 레시피를 볼 수 있다.
		HashMap map = new HashMap();
		String nowPage = "1";//뽐내기 menu를 클릭시에 page는 언제나 1이다.
		if (page != null) {//만약 입력받은 페이지가 null이 아니면 화면에서 페이지를 클릭 했다는 의미이므로
			nowPage = page;//nowPage에 입력받은 페이지를 입력시킨다.
		}
		//rownum은 한화면에 보여줄 레시피 숫자... 현재 1페이지당 15개의 게시물을 준다.
		map.put("rownum", CommonConstants.CONTENT_NUMBER_PER_PAGE);
		map.put("page", nowPage);//page는 현재 페이지
		map.put("user", user);//user는 관리자와 회원 구분하는 값이다. 관리자는 'a',일반회원은 'b'
		List list = dao.userListByRecipe(map);
		int userListCount = dao.userListCount(user);//총게시물수
		int nPage = Integer.parseInt(nowPage);//String 값인 현재페이지를 int형으로 변환 
		PagingBean pagingBean = new PagingBean(userListCount, nPage);
		//PagingBean의 생성자의 인자값인 총게시물수와, 현재 페이지를 넣어 PagingBean객체를 생성해준다.
		ListVO listvo = new ListVO(list, pagingBean);
		//ListVO의 생성자의 인자값인 list와 pagingBean을 넣어 ListVO 객체를 생성한다.
		return listvo;// 사용자만
	}
	
	public BBom_ListVO bbomListBySearchWord(HashMap map) throws SQLException{
		String user = "b";
		String nowPage = "1";
		String page=(String)map.get("page");
		if (page != null) {
			nowPage = page;
		}
		map.put("rownum", CommonConstants.CONTENT_NUMBER_PER_PAGE);
		map.put("page", nowPage);
		map.put("user", user);
		List list=dao.bbomListBySearchWord(map);
		int bbomListBySearchWordCount = dao.bbomListBySearchWordCount(map);
		System.out.println(bbomListBySearchWordCount);
		int nPage = Integer.parseInt(nowPage);
		System.out.println("map--------"+map);
		PagingBean pagingBean = new PagingBean(bbomListBySearchWordCount, nPage);
		System.out.println(pagingBean);
		BBom_ListVO listvo = new BBom_ListVO(list, pagingBean,map);
		System.out.println(listvo);
		return listvo;// 사용자만
	}

	public BBom_ListVO userListByRecipeBySearch(HashMap map) throws SQLException {
		String user = "b";
		String nowPage = "1";
		String page=(String)map.get("page");
		if (page != null) {
			nowPage = page;
		}
		map.put("rownum", CommonConstants.CONTENT_NUMBER_PER_PAGE);
		map.put("page", nowPage);
		map.put("user", user);
		List list = dao.userListByRecipeSeach(map);
		int userListCountBySearch = dao.userListCountBySearch(map);
		System.out.println("userListcount"+userListCountBySearch);
		int nPage = Integer.parseInt(nowPage);
		System.out.println(nowPage);
		PagingBean pagingBean = new PagingBean(userListCountBySearch,nPage);
		BBom_ListVO listvo = new BBom_ListVO(list,pagingBean,map);
		return listvo;// 사용자만
	}

	public Map getContent(HashMap hmap) throws SQLException {
		int r_no = (Integer) hmap.get("r_no");
		String user_id = (String) hmap.get("user_id");
		String content_id = (String) hmap.get("content_id");
		boolean flag = (Boolean) hmap.get("flag");

		RecipeVO rvo = dao.getRvoContent(r_no);
		Map map = new HashMap();
		map.put("flag", flag);
		//조회수 업데이트 코딩  ,  자기게시물이 아닐경우 count+1
		if (user_id != null) {
			if (!user_id.equals(content_id)) {
				dao.recipeUpadteCount(r_no);
			}
		} else if (flag == true) {
			dao.recipeUpadteCount(r_no);

		}

		List list = dao.getRdvoContent(r_no);

		map.put("user_id", user_id);
		map.put("content_id", content_id);
		map.put("rvo", rvo);
		map.put("list", list);
		return map;
	}
	// 처음 메인 화면에 접근시- 관리자의 최신 게시물과 , 조회순위 상위 10개의 게시물 정보를 가져온다

	public Map getTodayCook() throws SQLException, NotFoundRecipeException {
		String r_user = "a";
		//관리자의 가장 최근 게시물 1개의 r_no 를 가져옴
		String r_no = dao.getTodayCookHomeByNo(r_user);
		if(r_no==null){
			throw new NotFoundRecipeException("db자료없음");
		}
		HashMap hmap = new HashMap();
		hmap.put("r_user", r_user);
		hmap.put("r_no", r_no);
		//관리자의 recipe와 recipeDesc를 가져온다
		RecipeVO rvo = dao.getTodayCookHome(hmap);
		List list = dao.getRdvoContent(rvo.getR_no());
		hmap.put("rownum", CommonConstants.ROWNUM);
		hmap.put("rank", CommonConstants.RANK);
		hmap.put("click_re_type", "click");
		hmap.put("word_re_type", "word");
		Map map = new HashMap();
		dao.deleteYesterdayRank(CommonConstants.RANKINGDATESTANDARD);
		int count_click = dao.rankingRecipeCheck("click");
		System.out.println(count_click);
		if (count_click > 0) {
			List list_rank = dao.rankingToday(hmap);
			System.out.println(list_rank);
			map.put("list_rank", list_rank);
		} else {
			map.put("notFountRank", "아직 랭크된 것이 존재하지 않습니다.");
		}

		int count_word = dao.rankingRecipeCheck("word");
		System.out.println(count_word);
		if (count_word > 0) {
			List list_word = dao.rankingTodayWord(hmap);
			System.out.println(list_word);
			map.put("list_word", list_word);
		} else {
			map.put("notFountWordRank", "아직 랭크된 것이 존재하지 않습니다.");
		}
		List list_word = dao.rankingTodayWord(hmap);
		map.put("rvo", rvo);
		map.put("list", list);
		return map;
	}

	public HashMap getAnotherDayCook(String r_date) throws SQLException,
			NotFoundRecipeException {
		HashMap hmap = new HashMap();
		hmap.put("r_date", r_date);
		hmap.put("r_user", "a");
		RecipeVO rvo = dao.getAnotherDayCook(hmap);
		if (rvo == null) {
			throw new NotFoundRecipeException("페이지 없음");
		}
		hmap.put("rownum", CommonConstants.ROWNUM);
		hmap.put("rank", CommonConstants.RANK);
		hmap.put("click_re_type", "click");
		hmap.put("word_re_type", "word");
		dao.deleteYesterdayRank(CommonConstants.RANKINGDATESTANDARD);
		int count_click = dao.rankingRecipeCheck("click");
		System.out.println(count_click);
		if (count_click > 0) {
			List list_rank = dao.rankingToday(hmap);
			System.out.println(list_rank);
			hmap.put("list_rank", list_rank);
		} else {
			hmap.put("notFountRank", "아직 랭크된 것이 존재하지 않습니다.");
		}

		int count_word = dao.rankingRecipeCheck("word");
		System.out.println(count_word);
		if (count_word > 0) {
			List list_word = dao.rankingTodayWord(hmap);
			System.out.println(list_word);
			hmap.put("list_word", list_word);
		} else {
			hmap.put("notFountWordRank", "아직 랭크된 것이 존재하지 않습니다.");
		}

		System.out.println("service gettodayVO " + hmap);
		List list = dao.getRdvoContent(rvo.getR_no());
		hmap.put("rvo", rvo);
		hmap.put("list", list);
		return hmap;
	}

	public void getTodayCheckByAdmin(String r_date) throws SQLException,
			DuplicateWriteException {
		HashMap hmap = new HashMap();
		hmap.put("r_date", r_date);
		hmap.put("r_user", "a");
		System.out.println(hmap);
		int count = dao.getTodayCheckByAdmin(hmap);
		System.out.println(count + "count++++++");
		System.out.println(hmap);
		if (count != 0) {
			throw new DuplicateWriteException("이미작성");
		}
		System.out.println("service gettodayVO " + hmap);
	}

	public void update(RecipeVO vo, List list, int page) throws SQLException {
		dao.update(vo);
		int old = list.size() - page; // 기존에 있는 레시피
		for (int i = 0; i < old; i++) {
			RecipeDescVO rdvo = (RecipeDescVO) list.get(i);
			dao.updateDesc(rdvo);
		}
		HashMap hmap = new HashMap();
		hmap.put("r_no", vo.getR_no());
		hmap.put("r_title", vo.getR_title());
		//검색순위에 나오는 레시피 제목을 업데이트
		dao.updateReportTitle(hmap);
		// 새로 추가한 페이지를 insert해줌.
		for (int i = old; i < list.size(); i++) {
			RecipeDescVO rdvo = (RecipeDescVO) list.get(i);
			dao.writeDesc(rdvo);
		}
	}

	public void delete(int r_no) throws SQLException {
		dao.deleteDesc(r_no);
		dao.delete(r_no);
	}

	public ListVO getbbomListKind(String page, String r_type)
			throws SQLException {
		String user = "b";
		System.out.println(r_type + " service");
		HashMap map = new HashMap();
		String nowPage = "1";
		if (page != null) {
			nowPage = page;
		}
		map.put("rownum", CommonConstants.CONTENT_NUMBER_PER_PAGE);
		map.put("r_type", r_type);
		map.put("page", nowPage);
		map.put("r_user", user);
		System.out.println(map);
		List list = dao.getbbomListKind(map);
		System.out.println("list" + list);
		int userListCount = dao.userListCount(user);
		int nPage = Integer.parseInt(nowPage);
		PagingBean pagingBean = new PagingBean(userListCount, nPage);
		ListVO listvo = new ListVO(list, pagingBean);
		return listvo;
	}

	public HashMap searchByRecipeKind(String r_type) throws SQLException {
		// 한 Line당 게시물수
		int rownum = SearchConstants.CONTENT_NUMBER_PER_LINE;

		// 사용자
		HashMap user_map = new HashMap();
		user_map.put("r_user", "b");
		user_map.put("rownum", rownum);
		user_map.put("r_type", r_type);
		List list_user = dao.searchByRecipeKind(user_map);
		// 관리자
		HashMap admin_map = new HashMap();
		admin_map.put("r_user", "a");
		admin_map.put("rownum", rownum);
		admin_map.put("r_type", r_type);
		List list_admin = dao.searchByRecipeKind(admin_map);

		System.out.println(list_admin);

		HashMap map = new HashMap();
		map.put("list_user", list_user);
		map.put("list_admin", list_admin);
		return map;
	}
	//즐겨찾기 했나 안했나 확인
	public boolean isFavorite(FavoriteVO fvo) throws SQLException {
		boolean favorite_flag=false;
		int count=dao.favoriteByRNo(fvo);
		if(count>0){
			favorite_flag=true;
		}
		return favorite_flag;
	}
	//즐겨찾기 추가 addFavorite
	public void addFavorite(FavoriteVO vo) throws SQLException {
		dao.addFavorite(vo);
	}
	public List favorite(String m_id) throws SQLException{
		return dao.favorite(m_id);
	}
	public void deleteFavorite(FavoriteVO vo) throws SQLException {
		dao.deleteFavorite(vo);
	}
	public boolean isRate(RecipeGradeVO rgvo) throws SQLException {
		boolean flag = false;
		int cnt = dao.isRate(rgvo);
		if (cnt > 0) {
			flag = true;
		}
		return flag;
	}

	public void registerGrade(RecipeGradeVO rgvo) throws SQLException {
		dao.registerGrade(rgvo);
	}

	public void updateRecipeGrade(RecipeGradeVO rgvo) throws SQLException {
		dao.updateGcntRecipeGrade(rgvo);
		dao.addRecipeGrade(rgvo);
	}

	public void writeReply(RecipeReplyVO rrvo) throws SQLException {
		dao.writeReply(rrvo);
	}

	public Reply_ListVO getRecipeReplyList(String r_no, String pageNo)
			throws SQLException {
		if (pageNo == null || pageNo == "") // 목록보기 버튼 누를 )경우 최신 글을 보여주기 위해
			pageNo = "1";
		HashMap map = new HashMap();
		int rr_no = Integer.parseInt(r_no);
		map.put("r_no", rr_no);
		map.put("pageNo", pageNo);
		map.put("rownum", Reply_CommonConstants.CONTENT_NUMBER_PER_PAGE);
		List<RecipeReplyVO> list = dao.getRecipeReplyList(map);
		int total = dao.recipeReplyTotalContent(rr_no);
		Reply_PagingBean pagingBean = new Reply_PagingBean(total,
				Integer.parseInt(pageNo));
		Reply_ListVO lvo = new Reply_ListVO(list, pagingBean);
		return lvo;
	}

	// 레시피 검색_서브메뉴
	public HashMap searchListByWord(HashMap smap) throws SQLException {
		// 한 Line당 게시물수
		int rownum = SearchConstants.CONTENT_NUMBER_PER_LINE;
		String r_type = smap.get("r_type").toString(); // 레시피 타입
		String word = smap.get("word").toString(); // 검색어
		String s_type = smap.get("s_type").toString(); // 검색 조건
		String s_order = smap.get("s_order").toString(); // 정렬 기준
		String ss_order=smap.get("ss_order").toString();//정렬기준
		// 관리자
		HashMap admin_map = new HashMap();
		admin_map.put("r_user", "a");
		admin_map.put("rownum", rownum);
		admin_map.put("r_type", r_type);
		admin_map.put("word", word);
		admin_map.put("s_type", s_type);
		admin_map.put("s_order", s_order);
		admin_map.put("ss_order", ss_order);
		System.out.println("dsfdsffdsfs"+admin_map);
		List list_admin = dao.searchListByWord(admin_map);
		// 사용자
		HashMap user_map = new HashMap();
		user_map.put("r_user", "b");
		user_map.put("rownum", rownum);
		user_map.put("r_type", r_type);
		user_map.put("word", word);
		user_map.put("s_type", s_type);
		user_map.put("s_order", s_order);
		user_map.put("ss_order", ss_order);
		System.out.println("dsfdsffdsfs"+user_map);
		List list_user = dao.searchListByWord(user_map);
		// 결과값 묶기
		HashMap map = new HashMap();
		map.put("list_user", list_user);
		map.put("list_admin", list_admin);
		map.put("r_type", r_type);
		map.put("s_txt", word);
		map.put("s_type", s_type);
		map.put("s_order", s_order);
		map.put("ss_order", ss_order);
		return map;
	}// searchListByWord
	public void replyDelete(int r_no) throws SQLException {
		dao.replyDelete(r_no);
	}

	public void gradeDelete(int r_no) throws SQLException {
		dao.gradeDelete(r_no);
	}

	public void favoriteDelete(int r_no) throws SQLException {
		dao.favoriteDelete(r_no);
	}
	public void rankingDelete(int r_no) throws SQLException {
		dao.rankingDelete(r_no);
	}

	public ListVO getMyRecipe(HashMap map) throws SQLException{
		String nowPage = "1";
		String page=(String)map.get("page");
		String m_id=(String)map.get("m_id");
		System.out.println(page);
		map.put("page", nowPage);
		if (page != null) {
			nowPage = page;
			map.put("page", page);
		}
		List list_myRecipe=dao.getMyRecipe(map);
		System.out.println("list_myRecipe" + list_myRecipe);
		int userListCount = dao.myListTotalContents(m_id);
		int nPage = Integer.parseInt(nowPage);
		PagingBean pagingBean = new PagingBean(userListCount, nPage);
		ListVO listvo = new ListVO(list_myRecipe, pagingBean);
		return listvo;
	}
	public void deleteReply(RecipeReplyVO rrvo) throws SQLException {
		dao.deleteReply(rrvo);
	}




}
